﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Estructuras.Funciones.Analizar
{
    /// <summary>
    /// Clase que representa un árbol binario genérico.
    /// </summary>
    /// <typeparam name="T">Tipo del árbol binario</typeparam>
    public class ArbolBinario<T>
    {
        /// <summary>
        /// Dato del nodo.
        /// </summary>
        private T valor;

        /// <summary>
        /// Nodo a la izquierda.
        /// </summary>
        internal ArbolBinario<T> nodoIzq = null;

        /// <summary>
        /// Nodo a la derecha.
        /// </summary>
        internal ArbolBinario<T> nodoDer = null;

        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="valor">Dato a almacenar en el nodo</param>
        public ArbolBinario(T valor)
        {
            this.valor = valor;
        }

        /// <summary>
        /// Inserta un dato en el nodo actual.
        /// </summary>
        /// <param name="nodo">Nodo en el que almacenar el dato</param>
        /// <param name="valor">Valor a almacenar</param>
        public static void Insertar(ref ArbolBinario<T> nodo, T valor)
        {
            if (nodo == null)
                nodo = new ArbolBinario<T>(valor);
            else
                nodo.valor = valor;
        }

        /// <summary>
        /// Lista el contenido del árbol indicado.
        /// Lista el contenido de los nodos en el orden: izquierda, actual, derecha
        /// </summary>
        /// <param name="nodo">Nodo del arbol que listar</param>
        /// <param name="arbol">Lista en la que almacenar los datos</param>
        /// <returns>Lista con los datos listados</returns>
        public static List<T> Listar(ArbolBinario<T> nodo, List<T> arbol)
        {
            if (nodo.nodoIzq != null)
                Listar(nodo.nodoIzq, arbol);

            arbol.Add(nodo.valor);

            if (nodo.nodoDer != null)
                Listar(nodo.nodoDer, arbol);

            return arbol;
        }
    }   

}
